#include "common.h"

//#define __FIELDSYS_H_GLOBAL__
#include "fieldsys.h"

#include "field/field.h"
#include "system/main.h"
#include "system\render_oam.h"

#include "fieldmap.h"
#include "fieldmap_work.h"

#include "field_event.h"

#include "system/savedata.h"

#include "ev_mapchange.h"		//EventSet_FirstMapIn

#include "zonedata.h"
#include "fielddata/maptable/zone_id.h"

#include "system/pm_overlay.h"
#include "field/situation.h"
#include "field/situation_local.h"

#include "communication/communication.h"  // 通信処理のため
#include "comm_player.h"  // 通信処理のため
#include "comm_field_state.h"// 通信処理のため

#include "ev_check.h"		//EV_REQUEST

#include "demo/title.h"


#include "field_poketch.h"
#include "eventdata.h"
#include "field_camera.h"
#include "fld_pmtel.h"

#include "fieldsys_ol.h"

//#include "battle/trno_def.h"			//for magicon
#include "field/eventflag.h"			//for magicon
#include "field/evwkdef.h"				//for magicon
#include "AMProtect/AMProtect.h"		//for magicon
#include "sysflag_def.h"				//for magicon

FS_EXTERN_OVERLAY(amprotect);			//for magicon

static void AllocDummyMemory(FIELDSYS_WORK *fsys);
static void AllocDummyMemory2(void);

static void NotMagiconFunc1(void);
static void NotMagiconFunc2(void);

void FldsysSetup(PROC * proc, FIELDSYS_WORK * fsys)
{
	MAINWORK * main;

	u32 magicon = 2441*4073;	//素数ｘ素数

#if MAGICON_CHECK
	FS_LoadOverlay( MI_PROCESSOR_ARM9, FS_OVERLAY_ID(amprotect) );		//マジコンチェックオーバーレイロード

	//マジコンチェック1つ目
	magicon += (769 * (!AM_IsNotMagiconA1(NotMagiconFunc1)));		//素数足しこみ
#endif

	//セーブデータへのポインタを割り当て
	main = PROC_GetParentWork(proc);
	fsys->savedata = main->savedata;

	fsys->event = NULL;

#if MAGICON_CHECK
	//マジコンチェック2つ目
	magicon += (47 * (!AM_IsNotMagiconA3(NotMagiconFunc2)));		//素数足しこみ
#endif

	fsys->location = Situation_GetNowLocation(SaveData_GetSituation(fsys->savedata));

	//ゲーム制御用のワーク確保
	//ゲーム中、常に確保されているワークはここで確保する
	fsys->World = WorldMapInit();								//ワールドマップ構造体確保

#if MAGICON_CHECK
	//マジコンチェック3つ目
	magicon += (929 * AM_IsMagiconA2(AllocDummyMemory2));		//素数足しこみ
#endif

	EventData_Sys_Create(fsys, HEAPID_WORLD);					//イベントデータ制御生成
	fsys->bag_cursor = MyItem_BagCursorAlloc(HEAPID_WORLD);		//バッグのカーソル情報

#if MAGICON_CHECK
	FS_UnloadOverlay(MI_PROCESSOR_ARM9, FS_OVERLAY_ID(amprotect));		//マジコンチェックオーバーレイアンロード
#endif

#if MAGICON_CHECK
	//素数チェック
	if (magicon % 2441){
#ifdef PM_DEBUG
		GF_ASSERT_MSG(0,"MG_ERROR\n");
#endif
		AllocDummyMemory(fsys);
	}
#endif

//	fsys->p_zukandata = ZKN_DW_Alloc( HEAPID_WORLD );	// 図鑑リスト位置保存領域
	fsys->p_zukandata = ZUKANPARAM_Alloc( HEAPID_WORLD );	// 図鑑リスト位置保存領域

	fsys->PairPokeHumor = PAIR_POKE_HUMOR_Init(HEAPID_WORLD);	//連れ歩きポケモンの機嫌値
	fsys->pmtel_wk = FldPMTel_AllocWork(HEAPID_WORLD,fsys);	//電話ワーク確保

	fsys->JudgePowRndIdx = 0;		//ジャッジ判定インデックス

#if MAGICON_CHECK
	//素数チェック
	if (magicon % 4073){
#ifdef PM_DEBUG
		GF_ASSERT_MSG(0,"MG_ERROR\n");
#endif
		AllocDummyMemory(fsys);
	}
#endif
}

//------------------------------------------------------------------
/**
 * @brief	不正ロム用ダミーアロック関数
 * @param	fsys		フィールド制御ワークへのポインタ
 *
 * @return none
 */
//------------------------------------------------------------------
static void AllocDummyMemory(FIELDSYS_WORK *fsys)
{
	int i;
	int size;
	int num = 0;
#if 0
	//戦ったトレーナーの数を数え上げる
	for (i=0;i<TRNO_MAX;i++){
		int id = i+1;
		if ( EventWork_CheckEventFlag(
				SaveData_GetEventWork(fsys->savedata), TR_FLAG_START+id ) ){
			num++;
		}
	}
#else
	//バッジ数取得
	for( i=0; i < BADGE_MAX ;i++ ){
		if( MyStatus_GetBadgeFlag(SaveData_GetMyStatus(fsys->savedata), i) == TRUE ){
			num++;
		}
	}
#endif

	OS_Printf("バッジ数え上げの結果 %d個\n",num);

	if (num == 0){
		size = 20000;
	}else{
		size = num * 20000;
	}
	//アロケーション
	sys_AllocMemoryLo( HEAPID_BASE_APP, size );
}

//------------------------------------------------------------------
/**
 * @brief	不正ロム用ダミーアロック関数その2
 * @param	fsys		フィールド制御ワークへのポインタ
 *
 * @return none
 */
//------------------------------------------------------------------
static void AllocDummyMemory2(void)
{
	sys_AllocMemoryLo( HEAPID_BASE_APP, 1000 );
}

//------------------------------------------------------------------
/**
 * @brief	正規ロム用のときのコール関数その1
 */
//------------------------------------------------------------------
static void NotMagiconFunc1(void)
{
}

//------------------------------------------------------------------
/**
 * @brief	正規ロム用のときのコール関数その2
 */
//------------------------------------------------------------------
static void NotMagiconFunc2(void)
{
}
